/* Araujo Heiker CI. 19726991
 * Goyo Willandher CI.20666542
 * Rodriguez Rafael CI.20009872
 * Williams Roman CI.20016812 
 * Morett Gilberth CI.20929667*/

package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;

import vista.VentanaListaPedido;
import vista.VentanaPedido;
import vista.VentanaProducto;
import modelo.Cliente;
import modelo.Deposito;
import modelo.Drogueria;
import modelo.Estante;
import modelo.FacturaCompra;
import modelo.ItemCompra;
import modelo.ItemPedido;
import modelo.Linea;
import modelo.LoteProducto;
import modelo.Pedido;
import modelo.Producto;
import modelo.Proveedor;

public class ControladorVentanaPedido implements ActionListener, KeyListener {

	private VentanaPedido ventanaPedido;
	private Drogueria drogueria;
	private FacturaCompra facturaCompra;

	public ControladorVentanaPedido(Drogueria drogueria) {
		super();
		ventanaPedido = new VentanaPedido();
		ventanaPedido.agregarListener(this);
		ventanaPedido.setLocationRelativeTo(null);
		ventanaPedido.setVisible(true);
		this.drogueria = drogueria;
		this.llenarComboLineaPedido();
		this.generarCodigoPedido();
		ventanaPedido.desapacerBoton(0);
		// ventanaPedido.agregarKeyListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equalsIgnoreCase("Combo linea pedido")) {
			ventanaPedido.limpiarTablaProducto();
			llenarTablaProductoPedido();
		} else if (e.getActionCommand().equalsIgnoreCase("GuardarPedido")) {
			guardarPedido();
			ventanaPedido.dispose();
			new VentanaListaPedido();
			
		} else if (e.getActionCommand().equalsIgnoreCase("IdClientePedido")) {
			buscarClienteYAsignarlo(ventanaPedido.getTxtIdclientePedido());
		}else if (e.getActionCommand().equalsIgnoreCase("Aceptar Pedido")) {
			buscarUbicacion();
			ventanaPedido.desapacerBoton(1);
			ventanaPedido.desapacerBoton(2);
		}
		else if (e.getActionCommand().equalsIgnoreCase("AgregarP")) {

			if (ventanaPedido.numeroFilasSeleccionadasP() == 0) {
				ventanaPedido
						.mostrarMensajePedido("Debe selecionar un Producto");
			} else if (ventanaPedido.getTxtCantidadPedida().equals("")) {
				ventanaPedido
						.mostrarMensajePedido("Por favor introdusca la cantida a pedir");
			} else {
				agregarInformacionTablaPedido(ventanaPedido
						.obtenerCodigoProduFilaSeleccionada());

			}
		}
	}

	// Metodo que carga todas la linea que esten activa en el combo linea
	// que se encuetra en la ventana de pedido

	public void llenarComboLineaPedido() {
		for (int i = 0; i < drogueria.cantidadLineas(); i++) {
			Linea linea = drogueria.getUnaLinea(i);

			if (linea.getEstaus() == 'E') {
				continue;
			}
			// ventanaPedido.setCmbLineaPedidoIndex(0);
			String line = linea.getCodigoLinea() + " "
					+ linea.getClasificacion();

			ventanaPedido.agregarLineacmbLineaPedido(line);
		}
	}

	// Metodo que cargar los producto con estatus A al combo producto
	// que se encuetra en la ventana pedido
	// deacuerdo a la linea que se elija

	public void llenarTablaProductoPedido() {
		String intem = (String) ventanaPedido.getCmbLineaPedido()
				.getSelectedItem();
		String codigol = intem.substring(0, 4);
		int index = drogueria.buscarLinea(codigol);
		Linea linea = drogueria.getUnaLinea(index);
		String nombreLinea = linea.getClasificacion();

		ArrayList<Producto> productos = drogueria.getProductos();
		for (int i = 0; i < drogueria.cantidadProductos(); i++) {
			Producto producto = productos.get(i);

			if (producto.getEstatus() == 'E') {
				continue;

			}
			if (producto.getLinea().getClasificacion().equals(nombreLinea)) {
				Vector<String> datoProducto = new Vector<String>(4, 1);
				String codigo = producto.getCodigoProducto();
				String nombre = producto.getNombre();
				String presentacion = producto.getPresentacion();
				int can = producto.getCantidadDisponible();
				for (int j = 0; j < ventanaPedido.cantidadFilasProducto(); j++) {
					String infpedido = (String) (ventanaPedido.getTblPedido()
							.getValueAt(j, 0));
					System.out.println(infpedido);
					if (infpedido.equals(codigo)) {
						String cantp = (String) ventanaPedido.getTblPedido()
								.getModel().getValueAt(j, 2);
						int cantped = Integer.parseInt(cantp);
						can = can - cantped;
						System.out.println(can);
					}
					System.out.println(can);
				}

				System.out.println(can);
				String cantDispo = String.valueOf(can);
				System.out.println(can);
				datoProducto.add(codigo);
				datoProducto.add(nombre);
				datoProducto.add(presentacion);
				datoProducto.add(cantDispo);
				ventanaPedido.agregarFilaProductoPedido(datoProducto);
			}

		}

	}

	public void agregarInformacionTablaPedido(int fila) {
		String codtp = (String) ventanaPedido.getTblProductoP().getModel()
				.getValueAt(fila, 0);
		String ca = (String) ventanaPedido.getTblProductoP().getModel()
				.getValueAt(fila, 3);
		int cantidaal = Integer.parseInt(ca);
		int canti = Integer.parseInt(ventanaPedido.getTxtCantidadPedida());
		if (canti > cantidaal) {
			ventanaPedido
					.mostrarMensajePedido("La cantidad diponible no es suficiente para cubrir su pedido ");
			return;
		}
		for (int i = 0; i < ventanaPedido.cantidadfilasPedido(); i++) {
			String codigoPedido = (String) ventanaPedido.getTblPedido()
					.getModel().getValueAt(i, 0);
			int cant = Integer.parseInt(ventanaPedido.getTxtCantidadPedida());
			if (codtp.equalsIgnoreCase(codigoPedido)) {
				String cp = (String) ventanaPedido.getTblPedido().getModel()
						.getValueAt(i, 2);
				int cantotal = Integer.parseInt(cp);
				String cantagsinar = String.valueOf(cant + cantotal);
				ventanaPedido.getTblPedido().getModel()
						.setValueAt(cantagsinar, i, 2);
				return;
			} else {
				continue;
			}

		}
		String cod = (String) ventanaPedido.getTblProductoP().getModel()
				.getValueAt(fila, 0);
		String nombre = (String) ventanaPedido.getTblProductoP().getModel()
				.getValueAt(fila, 1);
		String cantid = ventanaPedido.getTxtCantidadPedida();
		Vector<String> dato = new Vector<String>(3, 1);
		dato.add(cod);
		dato.add(nombre);
		dato.add(cantid);
		ventanaPedido.agregarFilaPedido(dato);
	}

	// Metodo que busca el clente en el arreglo de cliente que se encuentra en
	// drogueria
	// si lo encuetra pega la direccion y el nombre y si no lo encuetra le da la
	// opcion de incluir al cliente
	public void buscarClienteYAsignarlo(String codigoCliente) {
		int index = drogueria.buscarCliente(codigoCliente);
		if (index == -1) {
			int cant = ventanaPedido
					.mostrarMensajeSiNO("Desea agregar un cliente");
			if (cant == 0) {
				new ControladorVentanaCliente(drogueria, "", "");
				return;
			}
		}
		Cliente cliente;
		cliente = drogueria.getUnCliente(index);
		String nombre = cliente.getNombre();
		String direccion = cliente.getDireccion();
		ventanaPedido.llenarCamposCliente(nombre, direccion);

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		char car = e.getKeyChar();
		if ((car < '0' || car > '9') && (car < 'a' || car > 'z')
				&& (car < 'A' || car > 'Z') && (car < ',' || car > '.')
				&& (e.getKeyCode() != KeyEvent.VK_ENTER))
			e.consume();

	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		// if (e.getKeyCode() != KeyEvent.VK_ENTER) {
		// ventanaPedido.setDireccionCliente("");
		// ventanaPedido.setNombreCliente("");
		// }

	}

	// Genera automaticamente el codigo de cada ves que relizan pedido

	public void generarCodigoPedido() {

		int e = drogueria.cantidadPedidos() + 1;
		String numero;
		if (e >= 0 && e <= 9) {
			numero = "PD-0" + 0 + e;
		} else {
			numero = "L-" + 0 + e;
		}
		ventanaPedido.setNroPedido(numero);
	}

	public void actulizarFecha() {
		ventanaPedido.setStchFecha(ventanaPedido.getStchFecha());
	}

	public void guardarPedido() {
		Pedido pedido = new Pedido();
		String codigoPedido = ventanaPedido.getTxtNroPedido();
		pedido.setCodigoPedido(codigoPedido);
		String cedCliente = ventanaPedido.getTxtIdclientePedido();
		int index = drogueria.buscarCliente(cedCliente);
		Cliente cliente = drogueria.getUnCliente(index);
		pedido.setCliente(cliente);
		pedido.setEstatus(pedido.ACTIVO);
		for (int i = 0; i < ventanaPedido.cantidadfilasPedido(); i++) {
			Producto producto = new Producto();
			Vector<String> itemArregloPedido = new Vector<String>(3, 1);
			itemArregloPedido = ventanaPedido.retornarItemPedido(i);
			String codigo = itemArregloPedido.get(0);
			int index1 = drogueria.buscarProducto(codigo);
			producto = drogueria.getUnProducto(index1);
			ItemPedido itemPedido = new ItemPedido();
			itemPedido.setProducto(producto);
			int cantida = Integer.parseInt(itemArregloPedido.get(2));
			int cantidadGuardadaDisp = drogueria.getUnProducto(index1)
					.getCantidadDisponible();
			cantidadGuardadaDisp = cantidadGuardadaDisp - cantida;
			drogueria.getUnProducto(index1).setCantidadDisponible(
					cantidadGuardadaDisp);
			itemPedido.setCantidadPedida(cantida);
			pedido.incluirItemPedido(itemPedido);
		}
		pedido.setFechaPedido(ventanaPedido.retornarDatePedido());
		drogueria.incluirPedido(pedido);
		ventanaPedido.mostrarMensaje("Pedido Incluido con exito");
	}

	public int diferenciaFechas(Date fechaVencimiento) {
		Date fechaSistema = new Date();
		DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
		String fechaSistemaString = df.format(fechaSistema);

		try {
			fechaSistema = df.parse(fechaSistemaString);
		} catch (ParseException ex) {

		}
		String fechaVencimientoString = df.format(fechaVencimiento);
		try {
			fechaVencimiento = df.parse(fechaVencimientoString);
		} catch (ParseException ex) {

		}
		long fechaVencimientoMs = fechaVencimiento.getTime();
		long fechaSistemaMs = fechaSistema.getTime();
		long diferencia = fechaVencimientoMs - fechaSistemaMs;
		double dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));
		return ((int) dias);
	}



	public void buscarUbicacion() {

		ArrayList<LoteProducto> auxlote = new ArrayList<LoteProducto>();
		System.out.println("entro al metodo");
		for (int k = 0; k < ventanaPedido.cantidadfilasPedido(); k++) {
			System.out.println("entro al primer for");
			String codigoProductoPedido = (String) ventanaPedido.getTblPedido()
					.getValueAt(k, 0);
			String cant = (String) ventanaPedido.getTblPedido()
					.getValueAt(k, 2);
			int cantidaPedida = Integer.parseInt(cant);

			for (int i = 0; i < drogueria.cantidadDepositos(); i++) {
				System.out.println("entro al 2 for");
				Deposito deposito = drogueria.getUnDeposito(i);
				for (int j = 0; j < deposito.cantEstantes(); j++) {
					System.out.println("entro al 3 for");
					Estante estante = deposito.getUnEstante(j);
					System.out.println(estante.cantidadLoteProducto());
					for (int r = 0; r < estante.cantidadLoteProducto(); r++)
						if (codigoProductoPedido.equals(estante.getLoteProducto(r).getProducto().getCodigoProducto())) {
							
							auxlote.add(estante.getLoteProducto(r));
							System.out.println("entro al for 4");
							break;
						}
				}
			}

			ArrayList<LoteProducto> loteOrdenado = new ArrayList<LoteProducto>();
			LoteProducto antiguo;
			while (auxlote.size() != 0) {
				antiguo = auxlote.get(0);
				for (int t = 1; t < auxlote.size(); t++) {
					LoteProducto prueba = auxlote.get(t);
					if(antiguo.getFechaVencimiento().after(prueba.getFechaVencimiento()))
						antiguo = auxlote.get(t);
					System.out.println("Ordenar");
				}
				loteOrdenado.add(antiguo);
				auxlote.remove(antiguo);
			}
			
			for (int h = 0; h < loteOrdenado.size(); h++) {
				Vector<String> dato = new Vector<String>(4, 1);
				LoteProducto loteActual = loteOrdenado.get(h);
				System.out.println("for ordenado");
				String nombre = loteActual.getProducto().getNombre();
				String codDeposito = loteActual.getEstante().getDeposito().getCodigo();
				String codEtPal = loteActual.getEstante().getNroEstante();
				String cantid; 
				
				if (loteActual.getCantidad() <= cantidaPedida){
					cantid = String.valueOf(loteActual.getCantidad());
					cantidaPedida -= loteActual.getCantidad();
					loteActual.getEstante().getLoteProducto().remove(loteActual);
					dato.add(nombre);
					dato.add(codDeposito);
					dato.add(codEtPal);
					dato.add(cantid);
					ventanaPedido.agregarFilaM(dato);
					
				}
				else {
					cantid = String
							.valueOf(cantidaPedida);
					loteActual.setCantidad(loteActual.getCantidad() - cantidaPedida);
					cantidaPedida = 0;
					dato.add(nombre);
					dato.add(codDeposito);
					dato.add(codEtPal);
					dato.add(cantid);
					ventanaPedido.agregarFilaM(dato);
				}
			System.out.println("negro marico");
//				dato.add(nombre);
//				dato.add(codDeposito);
//				dato.add(codEtPal);
//				dato.add(cantid);
//				ventanaPedido.agregarFilaM(dato);
				
				if(cantidaPedida == 0)
					break;
				
				
				
				
			}
		}
	}
}
